package 集合.二叉树;

import Useless.Test.Student;

import java.util.HashSet;

public class hashSet {
    public static void main(String[] args) {
        /*
        哈希值：
        1.根据hashcode方法计算出来的int类型的整数
        2.该方法定义在Object类中，所有的对象都可以调用，默认使用地址值进行计算
        3.一般情况下，会重写hashcode方法，利用对象内部的属性值计算哈希值

        对象的哈希值的特点：
        如果没有重写hashcodecode方法，不同对象计算出的哈希值是不同的
        如果重写了hashcode方法，不同的对象只要属性值相同，计算出的哈希值是相通的
        在小部分情况下，不同属性值或不同地址值计算出来的哈希值也有可能一样(哈希碰撞)
        */
        Student s1=new Student("zhangsan",18,"男");
        Student s2=new Student("lisi",17,"男");
        Student s3=new Student("wangwu",19,"男");
        Student s4=new Student("zhaoliu",20,"男");
        Student s5=new Student("zhangsan",18,"男");
//      没有重写hashCode方法，计算出的哈希值不同
        System.out.println(s1.hashCode());
        System.out.println(s5.hashCode());
//        重写哈希值在选用的类中重写，即在student类中重写 (ALT+INSERT)






        /*
        创建一个存储学生对象的集合，存储多个学生对象
        使用程序实现在控制台遍历该集合
        要求：学生对象的成员变量相同，我们就认为是同一个对象
         */
//        在使用的类为String， Integer时，不需要重写hashcCode，因为，这两个属于java，已经重写完毕
//        1.创建学生对象(使用上方创建的对象)

//        创建一个集合添加学生
        HashSet<Student> hs=new HashSet<>();
//        添加元素
        System.out.println(hs.add(s1));
        System.out.println(hs.add(s2));
        System.out.println(hs.add(s3));
        System.out.println(hs.add(s4));
        //重写了hashCode方法，那么在添加时计算的就是属性值，属性值相同，认为是同一个变量，不添加
        System.out.println(hs.add(s5));
        System.out.println(hs);

    }
}
